"""
Case Type   : 资源池化
Case Name   : 缩容单个备机，缩容后，备机节点上执行卸载数据库，扩容卸载的备机，再次缩容该备机
Create At   : 2024.10
Owner       : chen
Description :
    1.执行缩容备二
    gs_dropnode -U USER -G GROUP -h hostlist
    2.缩容完成后，在备二节点执行卸载数据库
    gs_uninstall --delete-data
    3.扩容备二
    gs_expansion -U {user} -G {user} -X {xml} -h {ip}
    4.缩容备二
    gs_dropnode -U USER -G GROUP -h hostlist
    5.扩容备二，恢复环境
Expect      :
    1.执行成功
    2.卸载成功
    3.扩容成功
    4.缩容成功
    5.恢复成功
"""

import os
import unittest
from testcase.utils.Logger import Logger
from testcase.utils.CommonSH import CommonSH
from testcase.utils.Constant import Constant
from yat.test import Node
from yat.test import macro

class SharedStorage(unittest.TestCase):
    def setUp(self):
        self.log = Logger()
        self.log.info(f'-----{os.path.basename(__file__)} start-----')
        self.pri_comsh = CommonSH('PrimaryDbUser')
        self.constant = Constant()
        self.pri_node = Node('PrimaryDbUser')
        self.pri_root_node = Node('PrimaryRoot')
        self.sta2_node = Node('Standby2DbUser')
        self.db_host = self.sta2_node.db_host
        self.s_user = self.pri_node.ssh_user

    def test_shared_storage(self):
        text = f'''-----step1: 执行缩容备二 expect: 执行成功-----'''
        self.log.info(text)
        cmd = f'''source {macro.DB_ENV_PATH};
        expect <<EOF
        set timeout 600
        spawn gs_dropnode -U {self.s_user} -G {self.s_user} \
            -h {self.db_host}
        expect "*drop the target node (yes/no)?*"
        send "yes\\n"
        expect eof\n''' + '''EOF'''
        self.log.info(cmd)
        res = self.pri_node.sh(cmd).result()
        self.log.info(res)
        self.assertIn('Success to drop the target nodes', res)

        text = f'''-----step2: 缩容完成后，在备二节点执行卸载数据库 expect: 卸载成功-----'''
        self.log.info(text)
        cmd = f'source {macro.DB_ENV_PATH}; gs_uninstall --delete-data'
        self.log.info(cmd)
        res = self.sta2_node.sh(cmd).result()
        self.log.info(res)

        text = f'''-----step3: 扩容备二 expect: 成功-----'''
        self.log.info(text)
        xml_path = macro.DB_XML_PATH
        cmd = f'''gs_expansion -U {self.s_user} -G \
            {self.s_user} -X {xml_path} -h {self.db_host}'''
        execute_cmd = f'''source {macro.DB_ENV_PATH};
        expect <<EOF
        set timeout 300
        spawn {cmd}
        expect "*assword*:"
        send "{self.pri_root_node.ssh_password}\\n"
        expect "*assword*:"
        send "{self.pri_root_node.ssh_password}\\n"
        expect "*lease repeat for database*:"
        send "{macro.GAUSSDB_INIT_USER_PASSWD}\\n"
        expect eof\n''' + '''EOF'''
        self.log.info(execute_cmd)
        res = self.pri_root_node.sh(execute_cmd).result()
        self.log.info(res)
        self.assertIn(f'{self.db_host}:\tSuccess', res)

        text = f'''-----step4: 缩容备二 expect: 执行成功-----'''
        self.log.info(text)
        cmd = f'''source {macro.DB_ENV_PATH};
        expect <<EOF
        set timeout 600
        spawn gs_dropnode -U {self.s_user} -G {self.s_user} \
            -h {self.db_host}
        expect "*drop the target node (yes/no)?*"
        send "yes\\n"
        expect eof\n''' + '''EOF'''
        self.log.info(cmd)
        res = self.pri_node.sh(cmd).result()
        self.log.info(res)
        self.assertIn('Success to drop the target nodes', res)

        cmd = f'source {macro.DB_ENV_PATH}; gs_uninstall --delete-data'
        self.log.info(cmd)
        res = self.sta2_node.sh(cmd).result()
        self.log.info(res)

    def tearDown(self):
        text = f'''-----step5: 恢复环境 expect: 成功-----'''
        self.log.info(text)
        xml_path = macro.DB_XML_PATH
        cmd = f'''gs_expansion -U {self.s_user} -G \
            {self.s_user} -X {xml_path} -h {self.db_host}'''
        execute_cmd = f'''source {macro.DB_ENV_PATH};
        expect <<EOF
        set timeout 300
        spawn {cmd}
        expect "*assword*:"
        send "{self.pri_root_node.ssh_password}\\n"
        expect "*assword*:"
        send "{self.pri_root_node.ssh_password}\\n"
        expect "*lease repeat for database*:"
        send "{macro.GAUSSDB_INIT_USER_PASSWD}\\n"
        expect eof\n''' + '''EOF'''
        self.log.info(execute_cmd)
        res = self.pri_root_node.sh(execute_cmd).result()
        self.log.info(res)
        self.assertIn(f'{self.db_host}:\tSuccess', res)
        self.log.info(f'-----{os.path.basename(__file__)} end-----')